package top.albertiy.单例模式;

public class Singleton {
    /**
     * 持有私有静态实例，防止被引用，此处赋值为null，目的是实现延迟加载
     */
    private static Singleton instance = null;

    /**
     * 私有构造方法，防止被实例化
     */
    private Singleton() {
    }

    private static class SingletonFactory {
        private static Singleton instance = new Singleton();
    }

    /**
     * 静态工厂方法，创建实例
     * 添加 synchronized 关键字，确保多线程下的线程安全
     * 改进为只在第一次创建对象时加锁
     * 然而Java中创建对象和赋值是分开的，仍可能导致在初始化前赋值，可利用静态成员只初始化一次的特性；
     * 实际情况是，单例模式使用内部类维护单例的实现，JVM机制保证当一个类被加载，这个类的加载过程是线程互斥的。
     * 该方法也只会在第一次调用的时候使用互斥机制，这样就解决了低性能问题。
     */
    public static synchronized Singleton getInstance() {
//        if (instance == null) {
//            synchronized (instance) {
//                if (instance == null) {
//                    instance = new Singleton();
//                }
//            }
//        }
//        return instance;
        return SingletonFactory.instance;
    }

    /* 如果该对象被用于序列化，可以保证对象在序列化前后保持一致 */
    public Object readResolve() {
        return instance;
    }
}
